package com.chisheng.caa.pojo;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;
import org.springframework.util.Assert;

import java.util.Arrays;
import java.util.Objects;
import java.util.Optional;

/**
 * 学期枚举
 */
public enum Semester implements ValueDesc {

    NONE(0, "未设定"),
    FRESHMAN_AUTUMN(1, "大一秋季学期"),
    FRESHMAN_SPRING(2, "大一春季学期"),
    SOPHOMORE_AUTUMN(3, "大二秋季学期"),
    SOPHOMORE_SPRING(4, "大二春季学期"),
    JUNIOR_AUTUMN(5, "大三秋季学期"),
    JUNIOR_SPRING(6, "大三春季学期"),
    SENIOR_AUTUMN(7, "大四秋季学期"),
    SENIOR_SPRING(8, "大四春季学期");

    /**
     * 默认的春秋季学期分隔月份。用作生成当前所处学期。
     */
    public final static int DEFAULT_SPLIT_MONTH = 7;

    /**
     * 序列化值。不允许重复。
     */
    private final Integer value;

    /**
     * 文本描述。不允许为 null。
     */
    private final String desc;

    /**
     * 枚举实例的默认构造函数。
     */
    Semester(Integer value, String desc) {
        this.value = value;
        this.desc = Objects.requireNonNull(desc);
    }

    @JsonValue
    @Override
    public Integer getValue() {
        return value;
    }

    @Override
    public String getDesc() {
        return desc;
    }

    /**
     * 返回序列化值所对应的枚举实例。
     */
    @JsonCreator
    public static Semester valueOf(int value) {
        Optional<Semester> semester = Arrays.stream(Semester.values()).filter(e -> e.value == value).findFirst();
        Assert.isTrue(semester.isPresent(), String.format("参数 'value' 无效的取值 '%d'", value));
        return semester.get();
    }

    // /**
    //  * 返回当前的学期枚举实例。
    //  */
    // public static Semester getCurrentSemester() {
    //     int month = Calendar.getInstance().get(Calendar.MONTH);
    //     return month < DEFAULT_SPLIT_MONTH ? SPRING : AUTUMN;
    // }

    // /**
    //  * 返回排课年级的学期值。合理的学期值的取值在 1 到 8 之间，分别表示从入学年到毕业年的 8
    //  * 个学期值，其中奇数值为秋季学期，偶数值为春季学期。排课年份和排课年级取值都可以为 null，
    //  * 当取值为 null 时表示使用系统当前的年份值。
    //  *
    //  * @param arrangementYear 排课年份或 null
    //  * @param gradeYear       排课年级或 null
    //  * @return 开课的学期值
    //  */
    // public int getTermValue(@Nullable Integer arrangementYear, @Nullable Integer gradeYear) {
    //     int year = Calendar.getInstance().get(Calendar.YEAR);
    //     arrangementYear = Objects.requireNonNullElse(arrangementYear, year);
    //     gradeYear = Objects.requireNonNullElse(gradeYear, year);
    //     return ((arrangementYear - gradeYear) << 1) + value;
    // }

}
